#define BLINKER_BLE //点灯科技app数据上传模式：蓝牙
#define ONE_WIRE_BUS 3// ds18b20数据线已插入Arduino上的端口3
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Blinker.h>//点灯：头文件
#include <stdio.h>
 OneWire oneWire(ONE_WIRE_BUS);  // 设置oneWire实例以与任何oneWire设备通信
 DallasTemperature sensors(&oneWire);// 通过我们的oneWire参考达拉斯温度

 BlinkerNumber WEN1("wena");//对应点灯数据wena
 BlinkerNumber WEN2("wenb");//对应点灯数据wenb
 BlinkerNumber WEN3("wenc");//对应点灯数据wenc 
 BlinkerNumber WEN4("wend");//对应点灯数据wend
 BlinkerNumber WEN5("wene");//对应点灯数据wene 
 BlinkerNumber WEN6("wenf");//对应点灯数据wenf
 BlinkerNumber WEN7("wen1");//对应点灯数据weng
 BlinkerNumber WEN8("wenh");//对应点灯数据wenh
 BlinkerNumber WENHIGE("wenhige");//对应点灯数据wenhige
 
 float tempC1,tempC2,tempC3,tempC4,tempC5,tempC6,tempC7,tempC8;
 float tempC[8];
 float maxTemp = 0;
 bool dataReceived = false; // 添加一个标志以跟踪是否已接收到数据
 bool qw = false;
 bool qwe = false;
 const int cc1 = 123;
 int INPUT11 = 2;
 int colonIndex = 0;
 int cc = 0;
 int maxIndex = -1;



  // 8个ds18b20的地址
 uint8_t sensor1[8] = { 0x28, 0xD7, 0x74, 0xEB, 0x19, 0x13, 0x01, 0xD3 };
 uint8_t sensor2[8] = { 0x28, 0xBC, 0x02, 0xD7, 0x19, 0x13, 0x01, 0x43 };
 uint8_t sensor3[8] = { 0x28, 0x49, 0xCE, 0xD2, 0x19, 0x13, 0x01, 0x58 };
 uint8_t sensor4[8] = { 0x28, 0x02, 0x92, 0xE1, 0x19, 0x13, 0x01, 0xA1 };
 uint8_t sensor5[8] = { 0x28, 0xB5, 0xA2, 0xD4, 0x19, 0x13, 0x01, 0x6E };
 uint8_t sensor6[8] = { 0x28, 0xD7, 0x98, 0xE4, 0x19, 0x13, 0x01, 0xB2 };
 uint8_t sensor7[8] = { 0x28, 0x34, 0x15, 0xE0, 0x19, 0x13, 0x01, 0xEB };
 uint8_t sensor8[8] = { 0x28, 0x65, 0xDA, 0xD0, 0x19, 0x13, 0x01, 0xF7 };
// N个ds18b20的地址（如没达到则留空，最高支持8个ds18b20）

  void BLINKER1() {
    if (!qwe) {
      Blinker.run();
      WEN1.print(tempC[0]);
      WEN2.print(tempC[1]);
      WEN3.print(tempC[2]);
      WEN4.print(tempC[3]);
      WEN5.print(tempC[4]);
      delay(3000);
      qwe = true;
    }else {
    Blinker.run();
    WEN6.print(tempC[5]);
    WEN7.print(tempC[6]);  
    WEN8.print(tempC[7]);
    WENHIGE.print(maxTemp);
    delay(3000);
    qwe = false;
    }
  }
  
  void sendData() {
  // 传输数据
  Serial.print(maxTemp);
  Serial.print(",");
  Serial.print(tempC[7]);
  Serial.print("\r\n");
    delay(3000);
  }
 void setup(void)
 {
   Serial.begin(9600);
   sensors.begin();
   Blinker.begin(0, 1);// 设置: 数字IO硬串口 单片机TX接蓝牙模块的RX以此类推, 波特率 9600 bps
   pinMode(INPUT11,INPUT);
 }
 void loop(void) {

  sensors.requestTemperatures();


  for (int i = 0; i < 8; i++) {
    tempC[i] = sensors.getTempCByIndex(i);
    if (tempC[i] > maxTemp) {
      maxTemp = tempC[i];
      maxIndex = i;
    }
  }

     if (digitalRead(INPUT11) == HIGH) {//检测蓝牙是否有连接上设备（jdy-18蓝牙模块的stat引脚当有设备连接时会变成高电平，没有则是低电平）
        if (!qw) {
            unsigned long startTime = millis();// 记录当前时间
            do {
                if (Serial.available()) {// 如果有可用数据
                    String message = Serial.readStringUntil('\n'); // 读取一行数据
                    int colonIndex = message.indexOf(':');// 查找冒号位置
                    String key = message.substring(0, colonIndex);// 获取键值 "cc"
                    String value = message.substring(colonIndex + 1);// 获取密码

                    if (key == "cc") {// 如果键值是 "cc"
                        cc = value.toFloat();// 将值存储到 cc 变量中，用于判断第一次收到的数据能与之cc2的值相同，差不多就是写了个类似于对暗号的操作
                        dataReceived = true; // 在成功读取数据后将标志设置为true
                        break;// 在成功读取数据后跳出dowhile循环
                        }
                    }

                
            } while (millis() - startTime < 1000);// 当时间未超过1秒
            qw = true;
        }
        if(dataReceived){//标志来跟踪是否已接收到数据。如果没有接收到数据，则不会上传数据或运行BLINKER1函数。
        if(cc==cc1){
            sendData();// 连接的是主机，上传数据
        }else{
            BLINKER1();//连接的不是主机，默认运行BLINKER
        }
    } else {
            BLINKER1();//连接的不是主机，默认运行BLINKER
    }
        } else {
        cc = 0;
        qw = false;
        dataReceived = false; // 在成功读取数据后将标志设置为true
    }
    maxTemp = 0;
}